/**
 * v-auth 操作权限处理
 * 指令使用方法：
 * v-auth=['权限标签']
 *
 * 方法使用
 * validAuth(['*:*:*', 'a:b:c'])
 *
 * Copyright (c) 2024 JulyCms
 */
import { App, DirectiveBinding } from 'vue';

import { usePermissionStore } from '@/store';

/**
 * 检查用户权限。
 *
 * 该函数用于验证当前用户是否拥有指定的一组权限中的任何一项。它通过查询权限存储模块来完成验证。
 * 如果提供的权限数组为空或不是数组形式，函数将直接返回true，表示权限验证通过。
 *
 * @param value 一个字符串数组，包含需要验证的权限项。
 * @returns 如果用户拥有指定权限中的任何一项，则返回true；否则返回false。
 */
export const $auth = (value: string[]) => {
  // 使用usePermissionStore钩子获取权限管理实例
  const permissions = usePermissionStore();
  // 检查传入的value是否为非空数组
  if (value && Array.isArray(value) && value.length) {
    // 遍历权限列表，检查是否包含传入的任意权限项
    return permissions.list.some((item) => {
      return value.includes(item);
    });
  }
  // 如果未指定权限项或指定的权限项为空数组，视为权限验证通过
  return true;
};

export const vAuth = {
  /**
   * 当元素被挂载到 DOM 上时执行的函数。
   *
   * 该函数的目的是根据指令绑定的值来判断当前元素是否有权限展示。如果没有权限，
   * 则移除该元素以避免敏感信息的泄露或无权限内容的展示。
   *
   * @param el 被指令绑定的 HTML 元素。
   * @param binding 指令的绑定对象，包含指令的值等信息。
   */
  mounted(el: HTMLElement, binding: DirectiveBinding) {
    // 判断当前元素是否有展示的权限
    const hasAuth = $auth(binding.value);

    // 如果没有权限且元素有父节点，则从父节点中移除该元素
    if (!hasAuth && el.parentNode) {
      el.parentNode.removeChild(el);
    }
  },
};

export default (app: App) => {
  // 注册指令
  app.directive('auth', vAuth);
};
